perm filename DV.PSC[MF,ALS]1 blob
sn#774823 filedate 1984-11-07 generic text, type T, neo UTF8
{3:}{$D-,W+}PROGRAM DVIIMAGEN(DVIFILE,OUTPUT);LABEL{4:}9999,30;{:4}
CONST{5:}MAXFONTS=100;MAXWIDTHS=10000;LINELENGTH=79;TERMINALLINE=150;
STACKSIZE=100;NAMESIZE=1000;NAMELENGTH=50;RASTERSIZE=100000;{:5}TYPE{8:}
ASCIICODE=32..126;{:8}{9:}TEXTFILE=PACKED FILE OF CHAR;{:9}{23:}
EIGHTBITS=0..255;BYTEFILE=PACKED FILE OF EIGHTBITS;{:23}VAR{10:}
XORD:ARRAY[CHAR]OF ASCIICODE;XCHR:ARRAY[0..255]OF CHAR;{:10}{24:}
DVIFILE:BYTEFILE;GFFILE:BYTEFILE;IMFILE:BYTEFILE;{:24}{27:}
CURLOC:INTEGER;GFCURLOC:INTEGER;
CURNAME:PACKED ARRAY[1..NAMELENGTH]OF CHAR;{:27}{31:}
FONTNUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTNAME:ARRAY[0..MAXFONTS]OF 0..NAMESIZE;
NAMES:ARRAY[0..NAMESIZE]OF ASCIICODE;
FONTCHECKSUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSCALEDSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTDESIGNSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSPACE:ARRAY[0..MAXFONTS]OF INTEGER;
FONTBC:ARRAY[0..MAXFONTS]OF INTEGER;FONTEC:ARRAY[0..MAXFONTS]OF INTEGER;
WIDTHBASE:ARRAY[0..MAXFONTS]OF INTEGER;
WIDTH:ARRAY[0..MAXWIDTHS]OF INTEGER;NF:0..MAXFONTS;
WIDTHPTR:0..MAXWIDTHS;{:31}{34:}INWIDTH:ARRAY[0..255]OF INTEGER;
GFCHECKSUM:INTEGER;{:34}{40:}PIXELWIDTH:ARRAY[0..MAXWIDTHS]OF INTEGER;
CONV:REAL;TRUECONV:REAL;NUMERATOR,DENOMINATOR:INTEGER;MAG:INTEGER;{:40}
{42:}OUTMODE:0..3;MAXPAGES:INTEGER;RESOLUTION:REAL;NEWMAG:INTEGER;{:42}
{43:}STARTCOUNT:ARRAY[0..9]OF INTEGER;STARTTHERE:ARRAY[0..9]OF BOOLEAN;
STARTVALS:0..9;COUNT:ARRAY[0..9]OF INTEGER;{:43}{46:}
BUFFER:ARRAY[0..TERMINALLINE]OF ASCIICODE;{:46}{49:}
BUFPTR:0..TERMINALLINE;{:49}{58:}INPOSTAMBLE:BOOLEAN;{:58}{65:}
DEFAULTDIREC:PACKED ARRAY[1..8]OF CHAR;{:65}{68:}TEXTPTR:0..LINELENGTH;
TEXTBUF:ARRAY[1..LINELENGTH]OF ASCIICODE;{:68}{73:}
H,V,W,X,Y,Z,HH,VV:INTEGER;
HSTACK,VSTACK,WSTACK,XSTACK,YSTACK,ZSTACK:ARRAY[0..STACKSIZE]OF INTEGER;
HHSTACK,VVSTACK:ARRAY[0..STACKSIZE]OF INTEGER;{:73}{74:}MAXV:INTEGER;
MAXH:INTEGER;MAXS:INTEGER;MAXVSOFAR,MAXHSOFAR,MAXSSOFAR:INTEGER;
TOTALPAGES:INTEGER;PAGECOUNT:INTEGER;{:74}{79:}S:INTEGER;SS:INTEGER;
CURFONT:INTEGER;SHOWING:BOOLEAN;{:79}{97:}OLDBACKPOINT:INTEGER;
NEWBACKPOINT:INTEGER;STARTED:BOOLEAN;{:97}{101:}POSTLOC:INTEGER;
FIRSTBACKPOI:INTEGER;STARTLOC:INTEGER;{:101}{108:}K,M,N,P,Q:INTEGER;
{:108}PROCEDURE INITIALIZE;VAR I:INTEGER;
BEGIN WRITELN('This is DVIIMAGEN, Version 0.1');{11:}
FOR I:=0 TO 31 DO XCHR[I]:='?';XCHR[32]:=' ';XCHR[33]:='!';
XCHR[34]:='"';XCHR[35]:='#';XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&';
XCHR[39]:='''';XCHR[40]:='(';XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+';
XCHR[44]:=',';XCHR[45]:='-';XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0';
XCHR[49]:='1';XCHR[50]:='2';XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5';
XCHR[54]:='6';XCHR[55]:='7';XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':';
XCHR[59]:=';';XCHR[60]:='<';XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?';
XCHR[64]:='@';XCHR[65]:='A';XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D';
XCHR[69]:='E';XCHR[70]:='F';XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I';
XCHR[74]:='J';XCHR[75]:='K';XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N';
XCHR[79]:='O';XCHR[80]:='P';XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S';
XCHR[84]:='T';XCHR[85]:='U';XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X';
XCHR[89]:='Y';XCHR[90]:='Z';XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']';
XCHR[94]:='↑';XCHR[95]:='_';XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b';
XCHR[99]:='c';XCHR[100]:='d';XCHR[101]:='e';XCHR[102]:='f';
XCHR[103]:='g';XCHR[104]:='h';XCHR[105]:='i';XCHR[106]:='j';
XCHR[107]:='k';XCHR[108]:='l';XCHR[109]:='m';XCHR[110]:='n';
XCHR[111]:='o';XCHR[112]:='p';XCHR[113]:='q';XCHR[114]:='r';
XCHR[115]:='s';XCHR[116]:='t';XCHR[117]:='u';XCHR[118]:='v';
XCHR[119]:='w';XCHR[120]:='x';XCHR[121]:='y';XCHR[122]:='z';
XCHR[123]:='{';XCHR[124]:='|';XCHR[125]:='}';XCHR[126]:='~';
FOR I:=127 TO 255 DO XCHR[I]:='?';{:11}{12:}
FOR I:=0 TO 127 DO XORD[CHR(I)]:=32;
FOR I:=32 TO 126 DO XORD[XCHR[I]]:=I;{:12}{32:}NF:=0;WIDTHPTR:=0;
FONTNAME[0]:=0;FONTSPACE[0]:=0;{:32}{44:}OUTMODE:=3;MAXPAGES:=1000000;
STARTVALS:=0;STARTTHERE[0]:=FALSE;{:44}{59:}INPOSTAMBLE:=FALSE;{:59}
{66:}DEFAULTDIREC:='[MF,ALS]';{:66}{69:}TEXTPTR:=0;{:69}{75:}
MAXV:=2147483548;MAXH:=2147483548;MAXS:=STACKSIZE+1;MAXVSOFAR:=0;
MAXHSOFAR:=0;MAXSSOFAR:=0;PAGECOUNT:=0;{:75}{98:}OLDBACKPOINT:=-1;
STARTED:=FALSE;{:98}END;{:3}{7:}PROCEDURE JUMPOUT;BEGIN GOTO 9999;END;
{:7}{25:}PROCEDURE OPENDVIFILE;BEGIN RESET(DVIFILE,'','/B:8');CURLOC:=0;
END;PROCEDURE OPENGFFILE;BEGIN RESET(GFFILE,CURNAME,'/B:8/O/N:9');
GFCURLOC:=0;END;{:25}{26:}PROCEDURE OPENIMFILE;
BEGIN REWRITE(IMFILE,'','/B:8');END;{:26}{28:}
FUNCTION GETGFBYTE:INTEGER;VAR B:EIGHTBITS;
BEGIN IF EOF(GFFILE)THEN GETGFBYTE:=0 ELSE BEGIN READ(GFFILE,B);
GFCURLOC:=GFCURLOC+1;GETGFBYTE:=B;END;END;FUNCTION GETGFTWOBYTE:INTEGER;
VAR A,B:EIGHTBITS;BEGIN READ(GFFILE,A);READ(GFFILE,B);
GFCURLOC:=GFCURLOC+2;GETGFTWOBYTE:=A*256+B;END;
FUNCTION GETGFTHREEBY:INTEGER;VAR A,B,C:EIGHTBITS;BEGIN READ(GFFILE,A);
READ(GFFILE,B);READ(GFFILE,C);GFCURLOC:=GFCURLOC+3;
GETGFTHREEBY:=(A*256+B)*256+C;END;FUNCTION GFSIGNEDQUAD:INTEGER;
VAR A,B,C,D:EIGHTBITS;BEGIN READ(GFFILE,A);READ(GFFILE,B);
READ(GFFILE,C);READ(GFFILE,D);GFCURLOC:=GFCURLOC+4;
IF A<128 THEN GFSIGNEDQUAD:=((A*256+B)*256+C)*256+D ELSE GFSIGNEDQUAD:=(
((A-256)*256+B)*256+C)*256+D;END;{:28}{29:}FUNCTION GETBYTE:INTEGER;
VAR B:EIGHTBITS;
BEGIN IF EOF(DVIFILE)THEN GETBYTE:=0 ELSE BEGIN READ(DVIFILE,B);
CURLOC:=CURLOC+1;GETBYTE:=B;END;END;FUNCTION SIGNEDBYTE:INTEGER;
VAR B:EIGHTBITS;BEGIN READ(DVIFILE,B);CURLOC:=CURLOC+1;
IF B<128 THEN SIGNEDBYTE:=B ELSE SIGNEDBYTE:=B-256;END;
FUNCTION GETTWOBYTES:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;GETTWOBYTES:=A*256+B;END;
FUNCTION SIGNEDPAIR:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;
IF A<128 THEN SIGNEDPAIR:=A*256+B ELSE SIGNEDPAIR:=(A-256)*256+B;END;
FUNCTION GETTHREEBYTE:INTEGER;VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);READ(DVIFILE,C);CURLOC:=CURLOC+3;
GETTHREEBYTE:=(A*256+B)*256+C;END;FUNCTION SIGNEDTRIO:INTEGER;
VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);READ(DVIFILE,B);
READ(DVIFILE,C);CURLOC:=CURLOC+3;
IF A<128 THEN SIGNEDTRIO:=(A*256+B)*256+C ELSE SIGNEDTRIO:=((A-256)*256+
B)*256+C;END;FUNCTION SIGNEDQUAD:INTEGER;VAR A,B,C,D:EIGHTBITS;
BEGIN READ(DVIFILE,A);READ(DVIFILE,B);READ(DVIFILE,C);READ(DVIFILE,D);
CURLOC:=CURLOC+4;
IF A<128 THEN SIGNEDQUAD:=((A*256+B)*256+C)*256+D ELSE SIGNEDQUAD:=(((A
-256)*256+B)*256+C)*256+D;END;{:29}{30:}FUNCTION DVILENGTH:INTEGER;
BEGIN SETPOS(DVIFILE,-1);DVILENGTH:=CURPOS(DVIFILE);END;
PROCEDURE MOVETOBYTE(N:INTEGER);BEGIN SETPOS(DVIFILE,N);CURLOC:=N;END;
{:30}{33:}PROCEDURE PRINTFONT(F:INTEGER);VAR K:0..NAMESIZE;
BEGIN IF F=NF THEN WRITE('UNDEFINED!')ELSE BEGIN FOR K:=FONTNAME[F]TO
FONTNAME[F+1]-1 DO WRITE(XCHR[NAMES[K]]);END;END;{:33}{35:}
FUNCTION INGF(Z:INTEGER):BOOLEAN;LABEL 9997,9999;VAR K:INTEGER;
LH:INTEGER;NW:INTEGER;WP:0..MAXWIDTHS;ALPHA,BETA:INTEGER;BEGIN{36:}{:36}
;{37:}{:37};{38:}{39:}BEGIN ALPHA:=16*Z;BETA:=16;
WHILE Z>=8388608 DO BEGIN Z:=Z DIV 2;BETA:=BETA DIV 2;END;END{:39};{:38}
;{41:}IF INWIDTH[0]<>0 THEN GOTO 9997;
WIDTHBASE[NF]:=WIDTHPTR-FONTBC[NF];
IF WP>0 THEN FOR K:=WIDTHPTR TO WP-1 DO IF WIDTH[K]=0 THEN BEGIN WIDTH[K
]:=2147483647;PIXELWIDTH[K]:=0;
END ELSE BEGIN WIDTH[K]:=INWIDTH[WIDTH[K]];
PIXELWIDTH[K]:=ROUND(CONV*(WIDTH[K]));END{:41};WIDTHPTR:=WP;INGF:=TRUE;
GOTO 9999;9997:WRITELN('---not loaded, GF file is bad');9999:END;{:35}
{45:}FUNCTION STARTMATCH:BOOLEAN;VAR K:0..9;MATCH:BOOLEAN;
BEGIN MATCH:=TRUE;
FOR K:=0 TO STARTVALS DO IF STARTTHERE[K]AND(STARTCOUNT[K]<>COUNT[K])
THEN MATCH:=FALSE;STARTMATCH:=MATCH;END;{:45}{48:}PROCEDURE INPUTLN;
VAR K:0..TERMINALLINE;BEGIN BREAK(TTY);RESET(TTY);
IF EOLN(TTY)THEN READLN(TTY);K:=0;
WHILE(K<TERMINALLINE)AND NOT EOLN(TTY)DO BEGIN BUFFER[K]:=XORD[TTY↑];
K:=K+1;GET(TTY);END;BUFFER[K]:=32;END;{:48}{50:}
FUNCTION GETINTEGER:INTEGER;VAR X:INTEGER;NEGATIVE:BOOLEAN;
BEGIN IF BUFFER[BUFPTR]=45 THEN BEGIN NEGATIVE:=TRUE;BUFPTR:=BUFPTR+1;
END ELSE NEGATIVE:=FALSE;X:=0;
WHILE(BUFFER[BUFPTR]>=48)AND(BUFFER[BUFPTR]<=57)DO BEGIN X:=10*X+BUFFER[
BUFPTR]-48;BUFPTR:=BUFPTR+1;END;
IF NEGATIVE THEN GETINTEGER:=-X ELSE GETINTEGER:=X;END;{:50}{51:}
PROCEDURE DIALOG;LABEL 1,2,3,4,5;VAR K:INTEGER;BEGIN REWRITE(TTY);
WRITELN(TTY,'This is DVIIMAGEN, Version 0.1');{52:}
1:WRITE(TTY,'Output level (default=3, ? for help): ');OUTMODE:=3;
INPUTLN;
IF BUFFER[0]<>32 THEN IF(BUFFER[0]>=48)AND(BUFFER[0]<=51)THEN OUTMODE:=
BUFFER[0]-48 ELSE BEGIN WRITE(TTY,'Type 3 for complete listing,');
WRITE(TTY,' 0 for errors only,');
WRITELN(TTY,' 1 or 2 for something in between.');GOTO 1;END{:52};{53:}
2:WRITE(TTY,'Starting page (default=*): ');STARTVALS:=0;
STARTTHERE[0]:=FALSE;INPUTLN;BUFPTR:=0;K:=0;
IF BUFFER[0]<>32 THEN REPEAT IF BUFFER[BUFPTR]=42 THEN BEGIN STARTTHERE[
K]:=FALSE;BUFPTR:=BUFPTR+1;END ELSE BEGIN STARTTHERE[K]:=TRUE;
STARTCOUNT[K]:=GETINTEGER;END;
IF(K<9)AND(BUFFER[BUFPTR]=46)THEN BEGIN K:=K+1;BUFPTR:=BUFPTR+1;
END ELSE IF BUFFER[BUFPTR]=32 THEN STARTVALS:=K ELSE BEGIN WRITE(TTY,
'Type, e.g., 1.*.-5 to specify the ');
WRITELN(TTY,'first page with \count0=1, \count2=-5.');GOTO 2;END;
UNTIL STARTVALS=K{:53};{54:}
3:WRITE(TTY,'Maximum number of pages (default=1000000): ');
MAXPAGES:=1000000;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN BEGIN MAXPAGES:=GETINTEGER;
IF MAXPAGES<=0 THEN BEGIN WRITELN(TTY,'Please type a positive number.');
GOTO 3;END;END{:54};{55:}4:WRITE(TTY,'Assumed device resolution');
WRITE(TTY,' in pixels per inch (default=240/1): ');RESOLUTION:=240.0;
INPUTLN;BUFPTR:=0;IF BUFFER[0]<>32 THEN BEGIN K:=GETINTEGER;
IF(K>0)AND(BUFFER[BUFPTR]=47)AND(BUFFER[BUFPTR+1]>48)AND(BUFFER[BUFPTR+1
]<=57)THEN BEGIN BUFPTR:=BUFPTR+1;RESOLUTION:=K/GETINTEGER;
END ELSE BEGIN WRITE(TTY,'Type a ratio of positive integers;');
WRITELN(TTY,' (1 pixel per mm would be 254/10).');GOTO 4;END;END{:55};
{56:}5:WRITE(TTY,'New magnification (default=0 to keep the old one): ');
NEWMAG:=0;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN IF(BUFFER[0]>=48)AND(BUFFER[0]<=57)THEN NEWMAG:=
GETINTEGER ELSE BEGIN WRITE(TTY,'Type a positive integer to override ');
WRITELN(TTY,'the magnification in the DVI file.');GOTO 5;END{:56};{57:}
WRITELN('Options selected:');WRITE(' Starting page = ');
FOR K:=0 TO STARTVALS DO BEGIN IF STARTTHERE[K]THEN WRITE(STARTCOUNT[K]:
1)ELSE WRITE('*');IF K<STARTVALS THEN WRITE('.')ELSE WRITELN(' ');END;
WRITELN(' Maximum number of pages = ',MAXPAGES:1);
WRITE(' Output level = ',OUTMODE:1);CASE OUTMODE OF 0:WRITELN(
' (showing bops, fonts, and error messages only)');
1:WRITELN(' (terse)');2:WRITELN(' (verbose)');
3:IF TRUE THEN WRITELN(' (the works)')ELSE BEGIN OUTMODE:=2;
WRITELN(' (the works: same as level 2 in this DVIIMAGEN)');END;END;
WRITELN(' Resolution = ',RESOLUTION:12:8,' pixels per inch');
IF NEWMAG>0 THEN WRITELN(' New magnification factor = ',NEWMAG/1000:8:3
){:57};END;{:51}{60:}PROCEDURE DEFINEFONT(E:INTEGER);VAR F:0..MAXFONTS;
P:INTEGER;N:INTEGER;C,Q,D:INTEGER;R:0..NAMELENGTH;J,K:0..NAMESIZE;
MISMATCH:BOOLEAN;BEGIN IF NF=MAXFONTS THEN BEGIN WRITE(' ',
'DVIIMAGEN capacity exceeded (max fonts=',MAXFONTS:1,')!');JUMPOUT;END;
FONTNUM[NF]:=E;F:=0;WHILE FONTNUM[F]<>E DO F:=F+1;{62:}C:=SIGNEDQUAD;
FONTCHECKSUM[NF]:=C;Q:=SIGNEDQUAD;FONTSCALEDSI[NF]:=Q;D:=SIGNEDQUAD;
FONTDESIGNSI[NF]:=D;P:=GETBYTE;N:=GETBYTE;
IF FONTNAME[NF]+N+P>NAMESIZE THEN BEGIN WRITE(' ',
'DVIIMAGEN capacity exceeded (name size=',NAMESIZE:1,')!');JUMPOUT;END;
FONTNAME[NF+1]:=FONTNAME[NF]+N+P;
IF SHOWING THEN WRITE(': ')ELSE WRITE('Font ',E:1,': ');
IF N+P=0 THEN WRITE('null font name!')ELSE FOR K:=FONTNAME[NF]TO
FONTNAME[NF+1]-1 DO NAMES[K]:=GETBYTE;NF:=NF+1;PRINTFONT(NF-1);
NF:=NF-1{:62};IF INPOSTAMBLE THEN BEGIN IF F<NF THEN WRITELN(
'---this font was already defined!');
END ELSE BEGIN IF F=NF THEN WRITELN(
'---this font wasn''t loaded before!');END;IF F=NF THEN{63:}BEGIN{67:}
FOR K:=1 TO NAMELENGTH DO CURNAME[K]:=' ';R:=0;
FOR K:=FONTNAME[NF]+P TO FONTNAME[NF+1]-1 DO IF(K<=FONTNAME[NF]+P+2)OR(K
>=FONTNAME[NF+1]-3)THEN BEGIN R:=R+1;
IF R+4>NAMELENGTH THEN BEGIN WRITE(' ',
'DVItype capacity exceeded (max font name length=',NAMELENGTH:1,')!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END;CURNAME[R+1]:='.';CURNAME[R+2]:='G';
CURNAME[R+3]:='F';R:=R+3;IF P=0 THEN FOR K:=1 TO 8 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(' ','Font name is too long!');JUMPOUT;
END;CURNAME[R]:=DEFAULTDIREC[K];
END ELSE FOR K:=FONTNAME[NF]TO FONTNAME[NF]+P-1 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(' ','Font name is too long!');JUMPOUT;
END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END{:67};OPENGFFILE;
IF EOF(GFFILE)THEN WRITE('---not loaded, GF file can''t be opened!')ELSE
BEGIN IF(Q<=0)OR(Q>=134217728)THEN WRITE('---not loaded, bad scale (',Q:
1,')!')ELSE IF(D<=0)OR(D>=134217728)THEN WRITE(
'---not loaded, bad design size (',D:1,')!')ELSE IF INGF(Q)THEN{64:}
BEGIN FONTSPACE[NF]:=Q DIV 6;
IF(C<>0)AND(GFCHECKSUM<>0)AND(C<>GFCHECKSUM)THEN BEGIN WRITELN(
'---beware: check sums do not agree!');
WRITELN(' (',C:1,' vs. ',GFCHECKSUM:1,')');WRITE(' ');END;
WRITE('---loaded at size ',Q:1,' DVI units');
D:=ROUND((100.0*CONV*Q)/(TRUECONV*D));IF D<>100 THEN BEGIN WRITELN(' ');
WRITE(' (this font is magnified ',D:1,'%)');END;NF:=NF+1;
FONTSPACE[NF]:=0;END{:64};END;IF OUTMODE=0 THEN WRITELN(' ');END{:63}
ELSE{61:}BEGIN IF FONTCHECKSUM[F]<>C THEN WRITELN(
'---check sum doesn''t match previous definition!');
IF FONTSCALEDSI[F]<>Q THEN WRITELN(
'---scaled size doesn''t match previous definition!');
IF FONTDESIGNSI[F]<>D THEN WRITELN(
'---design size doesn''t match previous definition!');J:=FONTNAME[F];
K:=FONTNAME[NF];MISMATCH:=FALSE;
WHILE J<FONTNAME[F+1]DO BEGIN IF NAMES[J]<>NAMES[K]THEN MISMATCH:=TRUE;
J:=J+1;K:=K+1;END;IF K<>FONTNAME[NF+1]THEN MISMATCH:=TRUE;
IF MISMATCH THEN WRITELN(
'---font name doesn''t match previous definition!');END{:61};END;{:60}
{70:}PROCEDURE FLUSHTEXT;VAR K:0..LINELENGTH;
BEGIN IF TEXTPTR>0 THEN BEGIN IF OUTMODE>0 THEN BEGIN WRITE('[');
FOR K:=1 TO TEXTPTR DO WRITE(XCHR[TEXTBUF[K]]);WRITELN(']');END;
TEXTPTR:=0;END;END;{:70}{71:}PROCEDURE OUTTEXT(C:ASCIICODE);
BEGIN IF TEXTPTR=LINELENGTH-2 THEN FLUSHTEXT;TEXTPTR:=TEXTPTR+1;
TEXTBUF[TEXTPTR]:=C;END;{:71}{76:}
FUNCTION FIRSTPAR(O:EIGHTBITS):INTEGER;
BEGIN CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,
94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
113,114,115,116,117,118,119,120,121,122,123,124,125,126,127:FIRSTPAR:=O
-0;128,133,235,239,243:FIRSTPAR:=GETBYTE;
129,134,236,240,244:FIRSTPAR:=GETTWOBYTES;
130,135,237,241,245:FIRSTPAR:=GETTHREEBYTE;
143,148,153,157,162,167:FIRSTPAR:=SIGNEDBYTE;
144,149,154,158,163,168:FIRSTPAR:=SIGNEDPAIR;
145,150,155,159,164,169:FIRSTPAR:=SIGNEDTRIO;
131,132,136,137,146,151,156,160,165,170,238,242,246:FIRSTPAR:=SIGNEDQUAD
;138,139,140,141,142,247,248,249,250,251,252,253,254,255:FIRSTPAR:=0;
147:FIRSTPAR:=W;152:FIRSTPAR:=X;161:FIRSTPAR:=Y;166:FIRSTPAR:=Z;
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:FIRSTPAR:=O-171;END;END;{:76}
{77:}FUNCTION RULEPIXELS(X:INTEGER):INTEGER;VAR N:INTEGER;
BEGIN N:=TRUNC(CONV*X);
IF N<CONV*X THEN RULEPIXELS:=N+1 ELSE RULEPIXELS:=N;END;{:77}{80:}{83:}
FUNCTION SPECIALCASES(O:EIGHTBITS;P,A:INTEGER):BOOLEAN;
LABEL 46,44,30,9998;VAR Q:INTEGER;K:INTEGER;BADCHAR:BOOLEAN;
PURE:BOOLEAN;VVV:INTEGER;BEGIN PURE:=TRUE;CASE O OF{86:}
157,158,159,160:BEGIN IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV
*(V+P))ELSE VV:=VV+ROUND(CONV*(P));IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','down',O-156:1,' ',P:1);END;GOTO 44;END;
161,162,163,164,165:BEGIN Y:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV*(V+P))ELSE VV:=VV+
ROUND(CONV*(P));IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','y',O-161:1,' ',P:1);END;GOTO 44;END;
166,167,168,169,170:BEGIN Z:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV*(V+P))ELSE VV:=VV+
ROUND(CONV*(P));IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','z',O-166:1,' ',P:1);END;GOTO 44;END;{:86}{87:}
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:BEGIN IF OUTMODE>0 THEN BEGIN
FLUSHTEXT;SHOWING:=TRUE;WRITE(A:1,': ','fntnum',P:1);END;GOTO 46;END;
235,236,237,238:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','fnt',O-234:1,' ',P:1);END;GOTO 46;END;
243,244,245,246:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','fntdef',O-242:1,' ',P:1);END;DEFINEFONT(P);GOTO 30;END;
{:87}239,240,241,242:{88:}BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','xxx ''');END;BADCHAR:=FALSE;
IF P<0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','string of negative length!');
END ELSE WRITE(' ','string of negative length!');
FOR K:=1 TO P DO BEGIN Q:=GETBYTE;IF(Q<32)OR(Q>126)THEN BADCHAR:=TRUE;
IF SHOWING THEN WRITE(XCHR[Q]);END;IF SHOWING THEN WRITE('''');
IF BADCHAR THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','non-ASCII character in xxx command!');
END ELSE WRITE(' ','non-ASCII character in xxx command!');GOTO 30;
END{:88};247:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','preamble command within a page!');
END ELSE WRITE(' ','preamble command within a page!');GOTO 9998;END;
248,249:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','postamble command within a page!');
END ELSE WRITE(' ','postamble command within a page!');GOTO 9998;END;
OTHERS:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','undefined command ',O:1,'!');
END ELSE WRITE(' ','undefined command ',O:1,'!');GOTO 30;END END;
44:{93:}
IF(V>0)AND(P>0)THEN IF V>2147483647-P THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',P:1,' to '
,2147483647-V:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',P:1,
' to ',2147483647-V:1);P:=2147483647-V;END;
IF(V<0)AND(P<0)THEN IF-V>P+2147483647 THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',P:1,' to '
,(-V)-2147483647:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',P:1,
' to ',(-V)-2147483647:1);P:=(-V)-2147483647;END;VVV:=ROUND(CONV*(V+P));
IF ABS(VVV-VV)>2 THEN IF VVV>VV THEN VV:=VVV-2 ELSE VV:=VVV+2;
IF SHOWING THEN BEGIN WRITE(' v:=',V:1);IF P>=0 THEN WRITE('+');
WRITE(P:1,'=',V+P:1,', vv:=',VV:1);END;V:=V+P;
IF ABS(V)>MAXVSOFAR THEN BEGIN IF ABS(V)>MAXV+99 THEN BEGIN IF NOT
SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','warning: |v|>',MAXV:1,'!');
END ELSE WRITE(' ','warning: |v|>',MAXV:1,'!');MAXV:=ABS(V);END;
MAXVSOFAR:=ABS(V);END;GOTO 30{:93};46:{95:}FONTNUM[NF]:=P;CURFONT:=0;
WHILE FONTNUM[CURFONT]<>P DO CURFONT:=CURFONT+1;
IF SHOWING THEN BEGIN WRITE(' current font is ');PRINTFONT(CURFONT);END;
GOTO 30{:95};9998:PURE:=FALSE;30:SPECIALCASES:=PURE;END;{:83}
FUNCTION DOPAGE:BOOLEAN;LABEL 41,42,43,45,30,9998,9999;VAR O:EIGHTBITS;
P,Q:INTEGER;A:INTEGER;HHH:INTEGER;BEGIN CURFONT:=NF;S:=0;H:=0;V:=0;W:=0;
X:=0;Y:=0;Z:=0;HH:=0;VV:=0;WHILE TRUE DO{81:}BEGIN A:=CURLOC;
SHOWING:=FALSE;O:=GETBYTE;P:=FIRSTPAR(O);
IF EOF(DVIFILE)THEN BEGIN WRITE(' ','Bad DVI file: ',
'the file ended prematurely','!');JUMPOUT;END;{82:}IF O<128 THEN{89:}
BEGIN IF(O>32)AND(O<=126)THEN BEGIN OUTTEXT(P);
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;WRITE(A:1,': ','setchar',P:1);
END;END ELSE IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','setchar',P:1);END;GOTO 41;END{:89}
ELSE CASE O OF 128,129,130,131:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','set',O-127:1,' ',P:1);END;GOTO 41;END;
133,134,135,136:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','put',O-132:1,' ',P:1);END;GOTO 41;END;
132:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','setrule');END;GOTO 42;END;
137:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','putrule');END;GOTO 42;END;{84:}
138:BEGIN IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;WRITE(A:1,': ','nop');
END;GOTO 30;END;139:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','bop occurred before eop!');
END ELSE WRITE(' ','bop occurred before eop!');GOTO 9998;END;
140:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','eop');END;
IF S<>0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','stack not empty at end of page (level ',S:1,')!');
END ELSE WRITE(' ','stack not empty at end of page (level ',S:1,')!');
DOPAGE:=TRUE;WRITELN(' ');GOTO 9999;END;
141:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','push');END;IF S=MAXSSOFAR THEN BEGIN MAXSSOFAR:=S+1;
IF S=MAXS THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','deeper than claimed in postamble!');
END ELSE WRITE(' ','deeper than claimed in postamble!');
IF S=STACKSIZE THEN BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;
WRITE(A:1,': ','DVIIMAGEN capacity exceeded (stack size=',STACKSIZE:1,
')');
END ELSE WRITE(' ','DVIIMAGEN capacity exceeded (stack size=',STACKSIZE:
1,')');GOTO 9998;END;END;HSTACK[S]:=H;VSTACK[S]:=V;WSTACK[S]:=W;
XSTACK[S]:=X;YSTACK[S]:=Y;ZSTACK[S]:=Z;HHSTACK[S]:=HH;VVSTACK[S]:=VV;
S:=S+1;SS:=S-1;GOTO 45;END;142:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','pop');END;
IF S=0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','(illegal at level zero)!');
END ELSE WRITE(' ','(illegal at level zero)!')ELSE BEGIN S:=S-1;
HH:=HHSTACK[S];VV:=VVSTACK[S];H:=HSTACK[S];V:=VSTACK[S];W:=WSTACK[S];
X:=XSTACK[S];Y:=YSTACK[S];Z:=ZSTACK[S];END;SS:=S;GOTO 45;END;{:84}{85:}
143,144,145,146:BEGIN IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[
CURFONT])THEN BEGIN OUTTEXT(32);HH:=ROUND(CONV*(H+P));
END ELSE HH:=HH+ROUND(CONV*(P));IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(A:1,': ','right',O-142:1,' ',P:1);END;Q:=P;GOTO 43;END;
147,148,149,150,151:BEGIN W:=P;
IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[CURFONT])THEN BEGIN OUTTEXT(
32);HH:=ROUND(CONV*(H+P));END ELSE HH:=HH+ROUND(CONV*(P));
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(A:1,': ','w',O-147:1,' ',P:1);END;Q:=P;GOTO 43;END;
152,153,154,155,156:BEGIN X:=P;
IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[CURFONT])THEN BEGIN OUTTEXT(
32);HH:=ROUND(CONV*(H+P));END ELSE HH:=HH+ROUND(CONV*(P));
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(A:1,': ','x',O-152:1,' ',P:1);END;Q:=P;GOTO 43;END;{:85}
OTHERS:IF SPECIALCASES(O,P,A)THEN GOTO 30 ELSE GOTO 9998 END{:82};
41:{90:}
IF P<0 THEN P:=255-((-1-P)MOD 256)ELSE IF P>=256 THEN P:=P MOD 256;
IF(P<FONTBC[CURFONT])OR(P>FONTEC[CURFONT])THEN Q:=2147483647 ELSE Q:=
WIDTH[WIDTHBASE[CURFONT]+P];
IF Q=2147483647 THEN BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','character ',P:1,' invalid in font ');
END ELSE WRITE(' ','character ',P:1,' invalid in font ');
PRINTFONT(CURFONT);IF CURFONT<>NF THEN WRITE('!');END;
IF O>=133 THEN GOTO 30;
IF Q=2147483647 THEN Q:=0 ELSE HH:=HH+PIXELWIDTH[WIDTHBASE[CURFONT]+P];
GOTO 43{:90};42:{91:}Q:=SIGNEDQUAD;
IF SHOWING THEN BEGIN WRITE(' height ',P:1,', width ',Q:1);
IF(P<=0)OR(Q<=0)THEN WRITE(' (invisible)')ELSE WRITE(' (',RULEPIXELS(P):
1,'x',RULEPIXELS(Q):1,' pixels)');END;IF O=137 THEN GOTO 30;
IF SHOWING THEN WRITELN(' ');HH:=HH+RULEPIXELS(Q);GOTO 43{:91};43:{92:}
IF(H>0)AND(Q>0)THEN IF H>2147483647-Q THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',Q:1,' to '
,2147483647-H:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',Q:1,
' to ',2147483647-H:1);Q:=2147483647-H;END;
IF(H<0)AND(Q<0)THEN IF-H>Q+2147483647 THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',Q:1,' to '
,(-H)-2147483647:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',Q:1,
' to ',(-H)-2147483647:1);Q:=(-H)-2147483647;END;HHH:=ROUND(CONV*(H+Q));
IF ABS(HHH-HH)>2 THEN IF HHH>HH THEN HH:=HHH-2 ELSE HH:=HHH+2;
IF SHOWING THEN BEGIN WRITE(' h:=',H:1);IF Q>=0 THEN WRITE('+');
WRITE(Q:1,'=',H+Q:1,', hh:=',HH:1);END;H:=H+Q;
IF ABS(H)>MAXHSOFAR THEN BEGIN IF ABS(H)>MAXH+99 THEN BEGIN IF NOT
SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','warning: |h|>',MAXH:1,'!');
END ELSE WRITE(' ','warning: |h|>',MAXH:1,'!');MAXH:=ABS(H);END;
MAXHSOFAR:=ABS(H);END;GOTO 30{:92};45:{94:}
IF SHOWING THEN BEGIN WRITELN(' ');
WRITE('level ',SS:1,':(h=',H:1,',v=',V:1,',w=',W:1,',x=',X:1,',y=',Y:1,
',z=',Z:1,',hh=',HH:1,',vv=',VV:1,')');END;GOTO 30{:94};
30:IF SHOWING THEN WRITELN(' ');END{:81};9998:WRITELN('!');
DOPAGE:=FALSE;9999:END;{:80}{96:}PROCEDURE SKIPPAGES;LABEL 9999;
VAR P:INTEGER;K:0..255;DOWNTHEDRAIN:INTEGER;BEGIN SHOWING:=FALSE;
WHILE TRUE DO BEGIN IF EOF(DVIFILE)THEN BEGIN WRITE(' ','Bad DVI file: '
,'the file ended prematurely','!');JUMPOUT;END;K:=GETBYTE;
P:=FIRSTPAR(K);CASE K OF 139:BEGIN{99:}NEWBACKPOINT:=CURLOC-1;
PAGECOUNT:=PAGECOUNT+1;FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN('backpointer in byte ',CURLOC-4
:1,' should be ',OLDBACKPOINT:1,'!');OLDBACKPOINT:=NEWBACKPOINT{:99};
IF NOT STARTED AND STARTMATCH THEN BEGIN STARTED:=TRUE;GOTO 9999;END;
END;132,137:DOWNTHEDRAIN:=SIGNEDQUAD;
243,244,245,246:BEGIN DEFINEFONT(P);WRITELN(' ');END;
239,240,241,242:WHILE P>0 DO BEGIN DOWNTHEDRAIN:=GETBYTE;P:=P-1;END;
248:BEGIN INPOSTAMBLE:=TRUE;GOTO 9999;END;OTHERS:END;END;9999:END;{:96}
{103:}PROCEDURE READPOSTAMBL;VAR K:INTEGER;P,Q,M:INTEGER;
BEGIN SHOWING:=FALSE;POSTLOC:=CURLOC-5;
WRITELN('Postamble starts at byte ',POSTLOC:1,'.');
IF SIGNEDQUAD<>NUMERATOR THEN WRITELN(
'numerator doesn''t match the preamble!');
IF SIGNEDQUAD<>DENOMINATOR THEN WRITELN(
'denominator doesn''t match the preamble!');
IF SIGNEDQUAD<>MAG THEN IF NEWMAG=0 THEN WRITELN(
'magnification doesn''t match the preamble!');MAXV:=SIGNEDQUAD;
MAXH:=SIGNEDQUAD;WRITE('maxv=',MAXV:1,', maxh=',MAXH:1);
MAXS:=GETTWOBYTES;TOTALPAGES:=GETTWOBYTES;
WRITELN(', maxstackdepth=',MAXS:1,', totalpages=',TOTALPAGES:1);
IF OUTMODE<3 THEN{104:}
BEGIN IF MAXV+99<MAXVSOFAR THEN WRITELN('warning: observed maxv was ',
MAXVSOFAR:1);
IF MAXH+99<MAXHSOFAR THEN WRITELN('warning: observed maxh was ',
MAXHSOFAR:1);
IF MAXS<MAXSSOFAR THEN WRITELN('warning: observed maxstackdepth was ',
MAXSSOFAR:1);
IF PAGECOUNT<>TOTALPAGES THEN WRITELN('there are really ',PAGECOUNT:1,
' pages, not ',TOTALPAGES:1,'!');END{:104};{106:}REPEAT K:=GETBYTE;
IF(K>=243)AND(K<247)THEN BEGIN P:=FIRSTPAR(K);DEFINEFONT(P);
WRITELN(' ');K:=138;END;UNTIL K<>138;
IF K<>249 THEN WRITELN('byte ',CURLOC-1:1,' is not postpost!'){:106};
{105:}Q:=SIGNEDQUAD;
IF Q<>POSTLOC THEN WRITELN('bad postamble pointer in byte ',CURLOC-4:1,
'!');M:=GETBYTE;
IF M<>2 THEN WRITELN('identification in byte ',CURLOC-1:1,' should be ',
2:1,'!');K:=CURLOC;M:=223;WHILE(M=223)AND NOT EOF(DVIFILE)DO M:=GETBYTE;
IF NOT EOF(DVIFILE)THEN BEGIN WRITE(' ','Bad DVI file: ',
'signature in byte ',CURLOC-1:1,' should be 223','!');JUMPOUT;
END ELSE IF CURLOC<K+4 THEN WRITELN(
'not enough signature bytes at end of file (',CURLOC-K:1,')');{:105};
END;{:103}{107:}BEGIN INITIALIZE;DIALOG;{109:}OPENDVIFILE;P:=GETBYTE;
IF P<>247 THEN BEGIN WRITE(' ','Bad DVI file: ',
'First byte isn''t start of preamble!','!');JUMPOUT;END;P:=GETBYTE;
IF P<>2 THEN WRITELN('identification in byte 1 should be ',2:1,'!');
{110:}NUMERATOR:=SIGNEDQUAD;DENOMINATOR:=SIGNEDQUAD;
IF NUMERATOR<=0 THEN BEGIN WRITE(' ','Bad DVI file: ','numerator is ',
NUMERATOR:1,'!');JUMPOUT;END;
IF DENOMINATOR<=0 THEN BEGIN WRITE(' ','Bad DVI file: ',
'denominator is ',DENOMINATOR:1,'!');JUMPOUT;END;
WRITELN('numerator/denominator=',NUMERATOR:1,'/',DENOMINATOR:1);
CONV:=(NUMERATOR/254000.0)*(RESOLUTION/DENOMINATOR);MAG:=SIGNEDQUAD;
IF NEWMAG>0 THEN MAG:=NEWMAG ELSE IF MAG<=0 THEN BEGIN WRITE(' ',
'Bad DVI file: ','magnification is ',MAG:1,'!');JUMPOUT;END;
TRUECONV:=CONV;CONV:=TRUECONV*(MAG/1000.0);
WRITELN('magnification=',MAG:1,'; ',CONV:16:8,' pixels per DVI unit'){:
110};P:=GETBYTE;WRITE('''');WHILE P>0 DO BEGIN P:=P-1;
WRITE(XCHR[GETBYTE]);END;WRITELN(''''){:109};
IF OUTMODE=3 THEN BEGIN{100:}N:=DVILENGTH;
IF N<53 THEN BEGIN WRITE(' ','Bad DVI file: ','only ',N:1,' bytes long',
'!');JUMPOUT;END;M:=N-4;
REPEAT IF M=0 THEN BEGIN WRITE(' ','Bad DVI file: ','all 223s','!');
JUMPOUT;END;MOVETOBYTE(M);K:=GETBYTE;M:=M-1;UNTIL K<>223;
IF K<>2 THEN BEGIN WRITE(' ','Bad DVI file: ','ID byte is ',K:1,'!');
JUMPOUT;END;MOVETOBYTE(M-3);Q:=SIGNEDQUAD;
IF(Q<0)OR(Q>M-33)THEN BEGIN WRITE(' ','Bad DVI file: ','post pointer ',Q
:1,' at byte ',M-3:1,'!');JUMPOUT;END;MOVETOBYTE(Q);K:=GETBYTE;
IF K<>248 THEN BEGIN WRITE(' ','Bad DVI file: ','byte ',Q:1,
' is not post','!');JUMPOUT;END;POSTLOC:=Q;
FIRSTBACKPOI:=SIGNEDQUAD{:100};INPOSTAMBLE:=TRUE;READPOSTAMBL;
INPOSTAMBLE:=FALSE;{102:}Q:=POSTLOC;P:=FIRSTBACKPOI;STARTLOC:=-1;
IF P<0 THEN INPOSTAMBLE:=TRUE ELSE BEGIN REPEAT IF P>Q-46 THEN BEGIN
WRITE(' ','Bad DVI file: ','page link ',P:1,' after byte ',Q:1,'!');
JUMPOUT;END;Q:=P;MOVETOBYTE(Q);K:=GETBYTE;
IF K=139 THEN PAGECOUNT:=PAGECOUNT+1 ELSE BEGIN WRITE(' ',
'Bad DVI file: ','byte ',Q:1,' is not bop','!');JUMPOUT;END;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;IF STARTMATCH THEN STARTLOC:=Q;
P:=SIGNEDQUAD;UNTIL P<0;IF STARTLOC<0 THEN BEGIN WRITE(' ',
'starting page number could not be found!');JUMPOUT;END;
MOVETOBYTE(STARTLOC+1);OLDBACKPOINT:=STARTLOC;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;P:=SIGNEDQUAD;STARTED:=TRUE;END;
IF PAGECOUNT<>TOTALPAGES THEN WRITELN('there are really ',PAGECOUNT:1,
' pages, not ',TOTALPAGES:1,'!'){:102};END ELSE SKIPPAGES;
IF NOT INPOSTAMBLE THEN{111:}
BEGIN WHILE MAXPAGES>0 DO BEGIN MAXPAGES:=MAXPAGES-1;WRITELN(' ');
WRITE(CURLOC-45:1,': beginning of page ');
FOR K:=0 TO STARTVALS DO BEGIN WRITE(COUNT[K]:1);
IF K<STARTVALS THEN WRITE('.')ELSE WRITELN(' ');END;
IF NOT DOPAGE THEN BEGIN WRITE(' ','Bad DVI file: ',
'page ended unexpectedly','!');JUMPOUT;END;REPEAT K:=GETBYTE;
IF(K>=243)AND(K<247)THEN BEGIN P:=FIRSTPAR(K);DEFINEFONT(P);K:=138;END;
UNTIL K<>138;IF K=248 THEN BEGIN INPOSTAMBLE:=TRUE;GOTO 30;END;
IF K<>139 THEN BEGIN WRITE(' ','Bad DVI file: ','byte ',CURLOC-1:1,
' is not bop','!');JUMPOUT;END;{99:}NEWBACKPOINT:=CURLOC-1;
PAGECOUNT:=PAGECOUNT+1;FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN('backpointer in byte ',CURLOC-4
:1,' should be ',OLDBACKPOINT:1,'!');OLDBACKPOINT:=NEWBACKPOINT{:99};
END;30:END{:111};
IF OUTMODE<3 THEN BEGIN IF NOT INPOSTAMBLE THEN SKIPPAGES;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN('backpointer in byte ',CURLOC-4
:1,' should be ',OLDBACKPOINT:1,'!');READPOSTAMBL;END;9999:END.{:107}